"""
提取视频中的每一帧
"""
import cv2
import os

def extract_all_frames(video_path, output_folder):
    """
    提取视频中的每一帧并保存为图片。

    :param video_path: 输入视频文件的路径。
    :param output_folder: 保存帧图片的输出文件夹路径。
    """
    # 检查输出文件夹是否存在，如果不存在则创建
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)

    # 打开视频文件
    cap = cv2.VideoCapture(video_path)

    # 检查视频是否成功打开
    if not cap.isOpened():
        print(f"错误：无法打开视频文件 {video_path}")
        return

    # 获取视频的基本信息
    fps = cap.get(cv2.CAP_PROP_FPS)
    width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
    height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
    total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))

    print(f"视频信息:")
    print(f"  - 帧率 (FPS): {fps}")
    print(f"  - 分辨率: {width}x{height}")
    print(f"  - 总帧数: {total_frames}")
    print(f"  - 视频时长 (秒): {total_frames / fps:.2f}")

    frame_count = 0

    print(f"开始提取帧...")

    # 循环读取视频帧
    while True:
        # ret 是一个布尔值，表示是否成功读取到帧
        # frame 是捕获到的帧图像（NumPy 数组）
        ret, frame = cap.read()

        # 如果 ret 为 False，说明已经读到了视频末尾
        if not ret:
            break

        # 定义输出图片的文件名，例如：frame_0001.jpg, frame_0002.jpg
        # 使用 zfill(4) 可以确保文件名是4位数字，便于排序
        output_filename = os.path.join(output_folder, f"frame_{str(frame_count).zfill(4)}.jpg")

        # 保存帧图像
        cv2.imwrite(output_filename, frame)

        frame_count += 1

        # 打印进度
        if frame_count % 100 == 0:
            print(f"已提取 {frame_count}/{total_frames} 帧...")

    # 释放资源
    cap.release()
    cv2.destroyAllWindows()

    print(f"帧提取完成！总共提取了 {frame_count} 帧，保存在 '{output_folder}' 文件夹中。")

# --- 使用示例 ---
if __name__ == "__main__":
    # 替换为你的视频文件路径
    input_video_path = "input/sample_1.mp4"
    # 替换为你希望保存帧的文件夹路径
    output_frames_folder = "extracted_frames_all"

    extract_all_frames(input_video_path, output_frames_folder)